|
Technote 1085
Using the Drag Manager to Interact with and Manipulate File System Entities
flavorTypeHFS ÇΔ flavorTypePromiseHFS DžǬǢǃ
ÉtÉ@ÉCÉãÉVÉXÉeÉÄÇÃÉGÉìÉeÉBÉeÉBÇëÄçÏÇ∑ÇÈÇΩÇflÅAflavorTypeHFS Ç®ÇÊÇ— flavorTypePromiseHFS ÇΔǢǧ 2 ǬÇÃÉfÅ[É^ÉtÉåÅ[ÉoÅ[Ç™ópà”Ç≥ÇÍǃǢNjÇ∑ÅBñºëOÇÕéóǃǢNjÇ∑Ç™ÅADZÇÍÇÁÇÃì≠Ç´ÇÕNjǡÇΩÇ≠àŸÇ»ÇËÇ‹Ç∑ÅBç≈LJëÂÇ´Ç»à·Ç¢ÇÕÅAàÍï˚Ç≈ÇÕÉtÉ@ÉCÉãÇ™ë∂ç›ÇµÇƒÇ¢ÇƒÅALJǧàÍï˚Ç≈ÇÕÉtÉ@ÉCÉãÇ™Ç‹Çæë∂ç›ÇµÇƒÇ¢Ç»Ç¢ÇΔǢǧDZÇΔÇ≈Ç∑ÅB
ä˘ë∂ÇÃÉtÉ@ÉCÉãÇéQèΔÇ∑ÇÈ flavorTypeHFS ÉfÅ[É^Ç DragReference ÇÃíÜÇ…íuÇ≠ÇΔǢǧDZÇΔÇÕÅAÅuÉhÉâÉbÉOÇÃéÛêMë§ (Drag Receiver) Ç™ä÷êSÇéùǬä˘ë∂ÇÃÉtÉ@ÉCÉã (é©ï™Ç≈çÏê¨ÇµÇΩǩǫǧǩDžä÷åWÇ»Ç≠) ÇímǡǃǢÇÈÅvÇΔî≠åæÇ∑ÇÈÇÊǧǻLJÇÃÇ≈Ç∑ÅBàÍï˚ÅAflavorTypePromiseHFS ÉfÅ[É^Ç DragReference Ç…íuÇ≠ÇΔǢǧDZÇΔÇÕÅAÅuíNÇ© (ÉhÉâÉbÉOÇÃéÛêMë§) Ç™ï€ë∂èÍèäÇéwíËǵǃÇ≠ÇÍÇÍÇŒÅAÇ∑ÇÆÇ…êVǵǢÉtÉ@ÉCÉãÇçÏê¨Ç∑ÇÈópà”ǙdžÇÈÅvÇΔî≠åæÇ∑ÇÈDZÇΔÇ…éóǃǢNjÇ∑ÅB
íçà”:
Drag Manager Ç…ÇÕÅADragReference Ç…ÉfÅ[É^Çó^ǶÇÈDZÇΔÇÅuñÒë©ÅvÇ∑ÇÈÇΔǢǧäTîOǙdžÇËÇ‹Ç∑ÅBÇΩÇæÇµÅADZÇÃDZÇΔÇ flavorTypePromiseHFS ÇΔç¨ìØÇµÇ»Ç¢Ç≈Ç≠ÇæÇ≥Ç¢ÅBDZÇÍÇÁ 2 ǬÇÃñÒë©ÇÕàŸÇ»ÇËÅADragReference Ç… flavorTypeHFS ÉfÅ[É^Çó^ǶÇÈÇΔñÒë©Ç∑ÇÈDZÇΔÇΔÅAflavorTypePromiseHFS ÇΔÇÕâΩÇÃä÷åWLJdžÇËÇ‹ÇπÇÒÅB
DZÇÃÇÊǧǻç¨ìØÇ™ì¡Ç…ÇÊÇ≠ãNDZÇÈÇÃÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ DragReference Ç… flavorTypePromiseHFS ÉfÅ[É^Çó^ǶÇÈDZÇΔÇñÒë©Ç∑ÇÈÇΔÇ´Ç≈Ç∑ÅBDZÇÃèÍçáÅAñÒë©ÇµÇΩÉfÅ[É^ÇÕÅAÇ≥ÇÁÇ…ÅAéÛêMë§ÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…êVǵÇ≠çÏê¨Ç≥ÇÍÇΩÉtÉ@ÉCÉãÇéQèΔÇ∑ÇÈÉfÅ[É^ÇãüããÇ∑ÇÈDZÇΔÇñÒë©Ç∑ÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅBǬNjÇËÅAä‘ê⁄ìIÇ»ñÒë©ÇÃñÒë©ÇΔǢǧDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB
DZÇà TECHNOTE Ç≈ÇÕÅAÇ≈Ç´ÇÈǩǨÇËÅuñÒë©ÅvÇΔǢǧópåÍÇìØéûÇ…ï°êîÇÃà”ñ°Ç≈égÇÌǻǢÇÊǧDžǵNjÇ∑ÅBǪÇÍÇ≈LJÅAè\ï™Ç…íçà”ǵǃñ{ï∂ÇÃì‡óeÇì«ÇÒÇ≈Ç≠ÇæÇ≥Ç¢ÅB
|
èdóv:
Drag Manager ÇÃÉtÉåÅ[ÉoÅ[ÉfÅ[É^ (Flavor Data) ÇÕäµó·âªÇµÇΩLJÇÃÇ…Ç∑ǨNjÇπÇÒÅBǬNjÇËÅAëóêMë§ (Sender) ÇΔéÛêMë§ (Receiver) ǙDZÇÃÉfÅ[É^Çê≥ǵÇ≠égópÇ≈Ç´ÇÈÇÊǧDžâΩÇÁÇ©Çà API Ç™ópà”Ç≥ÇÍǃǢÇÈÇÌÇØÇ≈ÇÕǻǢÇΔǢǧà”ñ°Ç≈Ç∑ÅBDZÇÍÇÁÇÃÉtÉåÅ[ÉoÅ[ÇåµñßÇ…ÉCÉìÉvÉäÉÅÉìÉgÇ∑ÇÈÇ…ÇÕèÌÇ…è\ï™Ç»íçà”Ç™ïKóvÇ≈Ç∑ÅB
é¿ç€ÇÃèÛãµÇÕǻǮàÍëwà´Ç¢ÇΔLJǢǶNjÇ∑ÅBDZÇÃèëófiÇÕÅADrag Manager ÇÃÉäÉäÅ[ÉXÇ©ÇÁêîîNå„Ç…é∑ïMÇ≥ÇÍNjǵÇΩÅBǪÇÃåãâ ÅADrag Manager ÇëÅÇ¢éûä˙Ç…çÃópǵÇΩÉfÉxÉçÉbÉpǙDZÇÍÇÁÇÃÉtÉåÅ[ÉoÅ[ÇìKêÿÇ…ÉCÉìÉvÉäÉÅÉìÉgÇ∑ÇÈDZÇΔÇÕç¢ìÔÇ≈ǵÇΩÅBǵǩLJÅADZÇà TECHNOTE ÇÃì«é“Ç™äJî≠ǵÇΩÉAÉvÉäÉPÅ[ÉVÉáÉìÇŸÇ«ó«êSìIÇ…äJî≠Ç≥ÇÍǃǢǻǢÉAÉvÉäÉPÅ[ÉVÉáÉìLJë∂ç›ÇµÇ‹Ç∑ÅBDZÇÃÇΩÇflÅAï‘Ç≥ÇÍÇÈÉGÉâÅ[ílÇÃÉ`ÉFÉbÉNÇ…ÇÕç◊êSÇÃíçà”Çï•Ç¢ÅAäJî≠Ç∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉRÅ[ÉhÇÃíÜÇ…ÉAÉTÅ[ÉVÉáÉìÇëgÇ›çûÇfiÇÊǧDžǵǃÇ≠ÇæÇ≥Ç¢ÅBǪǧÇ∑ÇÍÇŒÅADZÇà TECHNOTE Ç≈ê‡ñæÇ∑ÇÈäµèKÇ©ÇÁó\ëzÇ…îΩǵǃàÌíEÇ∑ÇÈëºÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìDžLJëŒèàÇ≈Ç´ÇÈèÄîıÇ™êÆÇ¢Ç‹Ç∑ÅB
|
flavorTypeHFS ÇÃégÇ¢ï˚
óùò_ìIÇ…ÇÕÅAflavorTypeHFS ÉfÅ[É^ÇÃégÇ¢ï˚ÇÕíPèÉÇ…å©Ç¶Ç‹Ç∑Ç™ÅAé¿ç€Ç…ÇÕÅAdžÇÁÇ©Ç∂ÇflímǡǃǮÇ≠ïKóvÇÃdžÇÈÇ¢Ç≠ǬǩÇÃÉgÉäÉbÉNÇ™ë∂ç›ÇµÇ‹Ç∑ÅBDZDZÇ≈ÇÕÅADZÇÍÇÁÇÃÉgÉäÉbÉNÇÃÇ¢Ç≠ǬǩDžǬǢǃê‡ñæÇµÇ‹Ç∑ÅBéQçlÇÃÇΩÇflÅA<Drag.h> Ç≈íËã`Ç≥ÇÍǃǢÇÈ HFSFlavor êÈåæÇÃÉRÉsÅ[ÇéüÇ…é¶ÇµÇ‹Ç∑ÅB
struct HFSFlavor
{
OSType fileType; // ÉtÉ@ÉCÉãÉ^ÉCÉv
OSType fileCreator; // ÉtÉ@ÉCÉãÉNÉäÉGÅ[É^
unsigned short fdFlags; // Finder ÉtÉâÉO
FSSpec fileSpec; // ÉtÉ@ÉCÉãÉVÉXÉeÉÄÇà spec
};
typedef struct HFSFlavor HFSFlavor;
|
flavorTypeHFS ÇÃëóêM
flavorTypeHFS ÉfÅ[É^Çä‹ÇfiÉhÉâÉbÉOÇäJénÇ∑ÇÈÇ…ÇÕÅAÇ‹Ç∏ HFSFlavor ÉåÉRÅ[ÉhÇêÈåæÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÃÉåÉRÅ[ÉhÇ…ÇÕÅAFSSpec ÇΔÅAêˆç›ìIÇ»ÉhÉâÉbÉOÇÃéÛêMë§Ç™ FSpGetFInfo ÇåƒÇ—èoÇ∑ÇÃÇîÇØÇÈÇΩÇflÇÃÅAǪÇÃëºÇ¢Ç≠ǬǩÇÃÉtÉBÅ[ÉãÉhÇ™ä‹Ç‹ÇÍǃǢNjÇ∑ÅB
éüÇÃÉXÉeÉbÉvÇΔǵǃÅAfileSpec ÉtÉBÅ[ÉãÉhÇìKêÿÇ…èâä˙âªÇµÇƒÅAÉfÅ[É^Ç™ÉtÉ@ÉCÉãÇéQèΔÇ∑ÇÈǩǫǧǩÇåàíËǵNjÇ∑ÅBÉtÉ@ÉCÉãÇéQèΔÇ∑ÇÈèÍçáÇÕÅAÉtÉ@ÉCÉãÇ…ëŒÇ∑ÇÈèÓïÒÇ…çáÇÌÇπǃÅAfileType ÅAfileCreator ÅAÇ®ÇÊÇ— fdFlags ÇÃäeÉtÉBÅ[ÉãÉhÇíPèÉÇ…ÉZÉbÉgǵNjÇ∑ÅBflavorTypeHFS ÉfÅ[É^Ç™ÉfÉBÉåÉNÉgÉäÇ‹ÇΩÇÕÉ{ÉäÉÖÅ[ÉÄÇéQèΔÇ∑ÇÈèÍçáÇÕÅAï\ 1 ÇéQçlDžǵǃÅAHFSFlavor ÉåÉRÅ[ÉhÇà fileType Ç®ÇÊÇ— fileCreator ÉtÉBÅ[ÉãÉhÇÉZÉbÉgǵNjÇ∑ÅB
ï\ 1Å@HFSFlavor ÉåÉRÅ[ÉhÇà fileType Ç®ÇÊÇ— fileCreator ÉtÉBÅ[ÉãÉh
ÉGÉìÉeÉBÉeÉBÇÃÉ^ÉCÉv | fileCreator | fileType |
ÉfÉBÉåÉNÉgÉä(ÉtÉHÉãÉ_) | MACS | fold |
É{ÉäÉÖÅ[ÉÄ(ÉfÉBÉXÉN) | MACS | disk |
DZÇÍÇÁÇÃílÇÕÅAÉtÉ@ÉCÉãà»äOÇÃLJÇÃÇéÊÇËàµÇ§êˆç›ìIÇ»ÉhÉâÉbÉOÇÃéÛêMë§Ç÷ÇÃÉqÉìÉgÇΔÇ»ÇËÇ‹Ç∑ÅBDZÇÍÇÁÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉoÉìÉhÉãÉäÉ\Å[ÉXÇÃíÜÇ≈égópǵÅAÉAÉvÉäÉPÅ[ÉVÉáÉìǙǪÇÃÉAÉCÉRÉìè„Ç…ÉhÉçÉbÉvÇ≥ÇÍÇΩÉtÉHÉãÉ_Ç‚ÉfÉBÉXÉNÇéÛÇØì¸ÇÍÇÈDZÇΔÇ Finder Ç…îFéØÇ≥ÇπÇÈílÇΔìØÇ∂LJÇÃÇ≈Ç∑ÅB
ÉRÅ[Éh #1: fileCreator Ç®ÇÊÇ— fileType ÉtÉBÅ[ÉãÉhÇÉZÉbÉgÇ∑ÇÈï˚ñ@ÇåàíËÇ∑ÇÈ
pascal OSErr MakeHFSFlavor
(short vRefNum, long dirID, ConstStr255Param path,
HFSFlavor register *hfsFlavorP)
{
OSErr err = noErr;
if (!(err = FSMakeFSSpec
(vRefNum, dirID, path, &(hfsFlavorP->fileSpec))))
{
CInfoPBPtr cipbp = (CInfoPBPtr) NewPtrClear (sizeof (*cipbp));
if (!(err = MemError ( )))
{
cipbp->hFileInfo.ioVRefNum = hfsFlavorP->fileSpec.vRefNum;
cipbp->hFileInfo.ioDirID = hfsFlavorP->fileSpec.parID;
cipbp->hFileInfo.ioNamePtr = hfsFlavorP->fileSpec.name;
if (!(err = PBGetCatInfoSync (cipbp)))
{
hfsFlavorP->fdFlags = cipbp->hFileInfo.ioFlFndrInfo.fdFlags;
if (hfsFlavorP->fileSpec.parID == fsRtParID)
{
hfsFlavorP->fileCreator = 'MACS';
hfsFlavorP->fileType = 'disk';
}
else if (cipbp->hFileInfo.ioFlAttrib & ioDirMask)
{
hfsFlavorP->fileCreator = 'MACS';
hfsFlavorP->fileType = 'fold';
}
else
{
hfsFlavorP->fileCreator = cipbp->hFileInfo.ioFlFndrInfo.fdCreator;
hfsFlavorP->fileType = cipbp->hFileInfo.ioFlFndrInfo.fdType;
}
}
DisposePtr ((Ptr) cipbp);
if (!err) err = MemError ( );
}
}
return err;
}
|
Finder ÇégÇ¡ÇΩÉRÉsÅ[ÇÃÉoÉO
ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ©ÇÁ Finder Ç… flavorTypeHFS ÉfÅ[É^ÇÉhÉâÉbÉOÇ∑ÇÈÇΔǢǧDZÇΔÇÕÅAèÌÇ…ãNDZÇËǧÇÈDZÇΔÇ™ëzíËÇ≥ÇÍÇ‹Ç∑ÅBǵǩǵÅAFinder ÇÃÉoÉOÇ…ÇÊÇËÅAëÂïîï™ÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕDZÇÃã@î\Çê≥èÌÇ…égópÇ≈Ç´Ç‹ÇπÇÒÅB
Finder ÇÃë§Ç©ÇÁå©ÇÈÇΔÅAflavorTypeHFS ÉfÅ[É^ÇÃéÛêMÇ…ÇÕÅAéüÇÃÇÊǧǻ 2 ǬÇÃÉPÅ[ÉXǙdžÇËǶNjÇ∑ÅBDZÇÃèÍçáÅA2 î‘ñ⁄ÇÃÉPÅ[ÉXÇÃï˚Ç™ÇÊÇËãªñ°ê[Ç¢ÇΔǢǶNjÇ∑ÅB
- ÉhÉçÉbÉvà íuÇ™ flavorTypeHFS ÉfÅ[É^ÇΔìØÇ∂É{ÉäÉÖÅ[ÉÄè„DždžÇÈÇΔÇ´ÅAFinder ÇÕÉtÉ@ÉCÉãÇíPèÉÇ…ÉhÉçÉbÉvà íuÇ…à⁄ìÆÇµÇ‹Ç∑ÅB
- ÉhÉçÉbÉvà íuÇ™àŸÇ»ÇÈÉ{ÉäÉÖÅ[ÉÄè„DždžÇÈÇΔÇ´ÅAFinder ÇÕÉtÉ@ÉCÉãÇêVǵǢÉ{ÉäÉÖÅ[ÉÄÇ…ÉRÉsÅ[Ç∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB
Finder ÇÕ AppleEvent Ç…ëŒâûǵǃǢNjÇ∑ÅBDZÇÃÇΩÇflÅAFinder ÇÕé©ï™é©êgÇ… AppleEvent ÇëóêMǵÅAÉtÉ@ÉCÉãÇÃêiíªèÛãµÇé¶Ç∑ÉEÉBÉìÉhÉEÇÃï\é¶Ç»Ç«ÅAdžÇÁljÇÈéÌófiÇÃìÆçÏÇé¿çsÇ∑ÇÈÇÊǧDžé©ï™é©êgÇ…ñΩóflǵNjÇ∑ÅBǵǩǵÅAFinder ÇÃÉhÉâÉbÉOéÛêMÉRÅ[ÉhÇÕÅAåÎǡǃÅADZÇÍÇÁÇÃì¡éÍÇ» AppleEvent ÇÉJÉåÉìÉgÉvÉçÉZÉXÇ≈ÇÕÇ»Ç≠ÉtÉçÉìÉgÉvÉçÉZÉXÇ…ëóêMǵǃǵNjǢNjÇ∑ÅBÉtÉçÉìÉgÉvÉçÉZÉXÇÕàÍî Ç…ÉhÉâÉbÉOÇäJénÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈Ç∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅADZÇÍÇÁÇÃÉCÉxÉìÉgÇ…ëŒâûÇ∑ÇÈÉnÉìÉhÉâÇéùÇΩǻǢÇΩÇflÅAAppleEvent Manager ÇÕ Finder Çà AESend åƒÇ—èoǵDžÉGÉâÅ[Çï‘ǵÅAFinder ÇÕèàóùëSëÃÇÉLÉÉÉìÉZÉãǵǃǵNjǢNjÇ∑ÅB
DZÇÃÉoÉOÇ™ÉtÉBÉbÉNÉXÇ≥ÇÍÇÈÇ‹Ç≈ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅADZÇÍÇÁÇà AppleEvent ÇâΩÇΔÇ©ÅuèàóùÅvǵǃÅADZǧǵÇΩñ‚ëËÇÃî≠ê∂ÇîÇØÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBFinder ÇÃÉoÉOÇ™ÉtÉBÉbÉNÉXÇ≥ÇÍÇΩÉVÉXÉeÉÄÇ≈ÇÕÅADZÇÃÉnÉìÉhÉâÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìì‡Ç≈ì~ñ∞èÛë‘Ç…Ç»ÇËÇ‹Ç∑ÅBÇΔǢǧÇÃLJÅAAppleEvent ÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÇ»Ç≠ Finder Ç…ëóÇÁÇÍÇÈÇÊǧDžǻÇÈÇΩÇflÇ≈Ç∑ÅBécîOǻDZÇΔÇ…ÅAåªç›ÇÃÇΔDZÇÎÅADZÇÍÇÁÇÃÉCÉxÉìÉgÇ Finder Ç…ÅuîΩâfÅvÇ≥ÇπÇÈDZÇΔÇÕÇ≈Ç´Ç‹ÇπÇÒÅBǵǩǵÅAApple Ç≈ÇÕǪǧǻÇÈÇÊǧDžìwóÕÇë±ÇØÇƒÇ¢Ç‹Ç∑ÅBDZÇÍÇÕÅAêiíªèÛãµÇÃï\é¶É_ÉCÉAÉçÉOÇégǧDZÇΔÇ™Ç≈ǴǻǢÇΔǢǧà”ñ°Ç≈Ç∑ÅBǵǩǵÅAívñΩìIÇ»è·äQÇ™î≠ê∂Ç∑ÇÈÇÊÇËÇÕNjǵÇΔçlǶÇÈǵǩdžÇËÇ‹ÇπÇÒÅB
ÉRÅ[Éh #2: Finder Ç©ÇÁãUÇà AppleEvent ÇéÛêMÇ∑ÇÈ
pascal OSErr BogusFinderEventHandler(const AppleEvent *, AppleEvent *, long)
{
return noErr; // ǪÇÃÉCÉ^ÉYÉâé“ÇÉtÉçÉAÇ…óéǡDZÇΔǵǃ (ÉhÉçÉbÉvǵǃ) Ç›ÇÈ
}
pascal OSErr InstallBogusFinderEventHandler (void)
{
OSErr err = noErr;
static AEEventHandlerUPP bogusFinderEventHandlerUPP;
if (!bogusFinderEventHandlerUPP)
{
bogusFinderEventHandlerUPP = NewAEEventHandlerProc (BogusFinderEventHandler);
if (!bogusFinderEventHandlerUPP)
err = nilHandleErr;
else
{
err = AEInstallEventHandler
('cwin', '****', bogusFinderEventHandlerUPP, 0, false);
if (err)
{
DisposeRoutineDescriptor (bogusFinderEventHandlerUPP);
bogusFinderEventHandlerUPP = nil;
}
}
}
return err;
}
|
flavorTypeHFS ÇÃéÛêM
flavorTypeHFS ÇÃéÛêM (ǵnjǵnj Finder Ç©ÇÁ) ÇÕÅAÉfÅ[É^ÇÃëºÇÃÉtÉåÅ[ÉoÅ[ÇÃéÛêMÇΔÇŸÇ⁄ìØÇ∂Ç≈Ç∑ÅBÇΩÇæÇµÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃíÜÇ…ÇÕÅAïsäÆëSÇ»ÉåÉRÅ[ÉhÇó^ǶÇÈLJÇÃǙdžÇÈÇΩÇflíçà”Ç™ïKóvÇ≈Ç∑ÅBDZÇÍÇÁÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAHFSFlavor ÉåÉRÅ[ÉhÇà fileSpec ÉtÉBÅ[ÉãÉhÇ…ä‹Ç‹ÇÍÇÈñºëOÉtÉBÅ[ÉãÉhÇÃññîˆÇ…džÇÈñ¢égópÉoÉCÉgÇãüããǵNjÇπÇÒ (DZÇÍÇÕëóêMë§ÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉoÉOÇ≈Ç∑Ç™ÅAǪÇÍÇ™ëºé–ÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈džÇÈèÍçáÅAǪÇÃÉoÉOÇÉtÉBÉbÉNÉXÇ∑ÇÈDZÇΔÇÕÇŸÇΔÇÒÇ«ïsâ¬î\Ç≈Ç∑)ÅB
ÉRÅ[Éh #3: FSSpec ÇÃç≈è¨ÉoÉCÉgÇåvéZÇ∑ÇÈ
(ÉRÅ[Éh #4ÅA#6ÅAÇ®ÇÊÇ— #14 Ç©ÇÁåƒÇ—èoÇ≥ÇÍÇÈä÷êî)
static pascal Size MinimumBytesForFSSpec (const FSSpec *fss)
{
// åƒÇ—èoǵå≥Ç≈ÇÕÉÅÉÇÉäÇà⁄ìÆÇµÇ»Ç¢Ç±ÇΔÇëOíÒDžǵǃǢÇÈ
return sizeof (*fss) - sizeof (fss->name) + *(fss->name) + 1;
}
|
ÉRÅ[Éh #4: flavorTypeHFS ÉfÅ[É^ÇíäèoÇ∑ÇÈ
pascal OSErr GetHFSFlavorFromDragReference
(DragReference dragRef, ItemReference itemRef, HFSFlavor *hfsFlavor)
{
OSErr err = noErr;
Size size = sizeof (*hfsFlavor);
err = GetFlavorData
(dragRef, itemRef, flavorTypeHFS, hfsFlavor, &size, 0);
if (!err)
{
Size minSize = sizeof (*hfsFlavor) - sizeof (hfsFlavor->fileSpec);
minSize += MinimumBytesForFSSpec (&(hfsFlavor->fileSpec));
// MinimumBytesForFSSpec DžǬǢǃÇÕÅAÉRÅ[Éh #3 ÇéQèΔ
if (size < minSize)
err = cantGetFlavorErr;
}
return err;
}
|
flavorTypePromiseHFS ÇÃégÇ¢ï˚
flavorTypePromiseHFS ÉfÅ[É^ÇÃégÇ¢ï˚ÇÕÅAflavorTypeHFS ÉfÅ[É^ÇÃégÇ¢ï˚Ç…î‰Ç◊ÇÈÇΔǩǻÇËï°éGÇ≈Ç∑ÅBDZǧǵÇΩï°éGÇ≥ÇÕÅAéÂÇΔǵǃÅAflavorTypePromiseHFS ÉfÅ[É^Ç™ï°êîÇÃïîï™Ç©ÇÁç\ê¨Ç≥ÇÍǃǢÇÈÇΔǢǧDZÇΔÇ…ãNàˆÇµÇƒÇ¢Ç‹Ç∑ÅBéQçlÇÃÇΩÇflÇ…ÅA<Drag.h> Ç≈íËã`Ç≥ÇÍǃǢÇÈ PromiseHFSFlavor êÈåæÇÃÉRÉsÅ[ÇéüÇ…é¶ÇµÇ‹Ç∑ÅB
struct PromiseHFSFlavor
{
OSType fileType; // ÉtÉ@ÉCÉãÉ^ÉCÉv
OSType fileCreator; // ÉtÉ@ÉCÉãÉNÉäÉGÅ[É^
unsigned short fdFlags; // Finder ÉtÉâÉO
FlavorType promisedFlavor; // ñÒë©ÇµÇΩÉtÉåÅ[ÉoÅ[
};
typedef struct PromiseHFSFlavor PromiseHFSFlavor;
|
flavorTypePromiseHFS ÇÃëóêM
ÉtÉ@ÉCÉãçÏê¨ÇÃñÒë©
TrackDrag ÇåƒÇ—èoÇ∑ëOÇ…ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAÉfÅ[É^ÇÃäeïîï™Ç…ǬǢǃ 1 ìxÇ∏ǬÅAǪÇÃìsìxìØÇ∂ ItemReference ílÇìnǵǃÅAAddDragItemFlavor Ç 2 ìxåƒÇ—èoÇ∑ïKóvǙdžÇËÇ‹Ç∑ÅB
ç≈èâÇÃåƒÇ—èoǵÇ≈ÇÕÅAPromiseHFSFlavor å^ÇÃÉåÉRÅ[ÉhÇêÈåæÇµÅApromisedFlavor ÉtÉBÅ[ÉãÉhÇ… 'fssP' (0x66737350) Çê›íËǵNjÇ∑ÅBÅwThe Drag Manager Programmer's GuideÅxÇ≈ÇÕÅApromisedFlavor Ç…îCà”ÇÃílÇê›íËÇ∑ÇÈÇΔèëÇ©ÇÍǃǢNjÇ∑Ç™ÅADZDZDžé¶ÇµÇΩílÇéwíËÇ∑ÇÈDZÇΔÇÇ®ä©ÇflǵNjÇ∑ (è⁄ç◊DžǬǢǃÇÕå„èqǵNjÇ∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ä˘Ç…ëºÇÃílÇégǡǃǢǃLJÅAǪÇÍÇ™ 'rWm1' Ç≈Ç»ÇØÇÍÇŒì¡Ç…ñ‚ëËÇÕdžÇËÇ‹ÇπÇÒ)ÅBPromiseHFSFlavor ÉåÉRÅ[ÉhÇÃëºÇÃÉtÉBÅ[ÉãÉhÇìKêÿÇ»ílÇ≈ñÑÇflÅAFlavorType ÉpÉâÉÅÅ[É^Ç… flavorTypePromiseHFS ÇìnǵǃÅAÉåÉRÅ[ÉhÇ DragReference Ç…í«â¡ÇµÇ‹Ç∑ÅB
2 ìxñ⁄Çà AddDragItemFlavor åƒÇ—èoǵÇ≈ÇÕÅAFlavorType ÉpÉâÉÅÅ[É^Ç… 'fssP' ÇìnǵNjÇ∑ÅBdataPtr Ç®ÇÊÇ— dataSize ÉpÉâÉÅÅ[É^Ç…ÇÕ 0 ÇìnǵÅAå„Ç≈éÁÇÈñÒë©ÇÉZÉbÉgÉAÉbÉvǵNjÇ∑ÅB
ÉRÅ[Éh #5: flavorTypePromiseHFS ÉfÅ[É^Çí«â¡Ç∑ÇÈ
pascal OSErr AddDragItemFlavorTypePromiseHFS
(DragReference dragRef, ItemReference itemRef,
OSType fileType, OSType fileCreator,
UInt16 fdFlags, FlavorType promisedFlavor)
{
OSErr err = noErr;
PromiseHFSFlavor phfs;
phfs.fileType = fileType;
phfs.fileCreator = fileCreator;
phfs.fdFlags = fdFlags;
phfs.promisedFlavor = promisedFlavor;
if (!(err = AddDragItemFlavor
(dragRef, itemRef, flavorTypePromiseHFS,
&phfs, sizeof(phfs), flavorNotSaved)))
{
err = AddDragItemFlavor
(dragRef, itemRef, promisedFlavor, nil, 0, flavorNotSaved);
}
return err;
}
|
èdóv:
Finder ÇÃàÍïîÇÃÉoÅ[ÉWÉáÉìÇ…ÇÕÉoÉOǙdžÇÈÇΩÇflÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAÇ«ÇÃÉtÉåÅ[ÉoÅ[ÉfÅ[É^ÇÊÇËLJëOÇ… flavorTypePromiseHFS ÉtÉåÅ[ÉoÅ[ÉfÅ[É^Çí«â¡ÇµÅAǪÇÃÇ∑ÇÆå„Ç… promisedFlavor ÉtÉBÅ[ÉãÉhÇ…ëŒÇ∑ÇÈÉtÉåÅ[ÉoÅ[ÉfÅ[É^Çí«â¡Ç∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìǙDZÇÍÇÁÇÃÉtÉåÅ[ÉoÅ[ÇDZÇÃèáèòÇ≈í«â¡ÇµÇ»Ç¢ÇΔÅAFinder ÇÕǪÇÃÉtÉ@ÉCÉãÇÃÉAÉCÉRÉìÇê≥ǵǢà íuÇ…ï\é¶Ç≈Ç´Ç»Ç≠Ç»ÇËÇ‹Ç∑ÅB
|
íçà”:
ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ SetDragSendDataProc ÇåƒÇ—èoǵǃÅADragSendDataProc Ç DragReference Ç…Ç‹ÇæÉAÉ^ÉbÉ`ǵǃǢǻǢèÍçáÇÕÅADZÇÃã@î\Çí«â¡Ç∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB
|
DZÇà DragReference Ç…íÒãüÇ∑ÇÈïKóvÇÃdžÇÈǪÇÃëºÇÃÉtÉåÅ[ÉoÅ[Çí«â¡Ç∑ÇÍÇŒÅATrackDrag ÇåƒÇ—èoÇ∑èÄîıÇ™êÆÇ¢Ç‹Ç∑ÅB
ñÒë©ÇÃèÖéÁ
Drag Manager Ç™ flavorTypePromiseHFS ÉfÅ[É^Çà promisedFlavor ÉtÉBÅ[ÉãÉhÇ…ìôǵǢ FlavorType ÇÉäÉNÉGÉXÉgÇ∑ÇÈÇΔÇ´ÅAñÒë©ÇµÇΩÉtÉ@ÉCÉãÇà¯Ç´ìnÇ∑DZÇΔÇ…ÇÊǡǃñÒë©ÇéÁÇÈÇÃÇÕÉfÉxÉçÉbÉpÇÃñäÑÇ≈Ç∑ÅBñÒë©ÇéÁÇÈÇΔǢǧDZÇΔÇÃíÜÇ…ÇÕÅAÉhÉâÉbÉOÇÃéÛêMë§Ç™ç≈èIìIÇ…ÉtÉ@ÉCÉãÇïKóvÇΔÇ∑ÇÈèÍèäÇå©Ç¬ÇØÇΩÇËÅAÉtÉ@ÉCÉãÇçÏê¨Ç∑ÇÈèÍèäÇåàíËÇ∑ÇÈDZÇΔÅAÇ≥ÇÁÇ…ÉtÉ@ÉCÉãǪÇÃLJÇÃÇçÏê¨Ç∑ÇÈDZÇΔÇ™ä‹Ç‹ÇÍÇ‹Ç∑ÅBDZÇÍÇÕÅADragReference Ç…ä÷òAÇ√ÇØÇÁÇÍÇΩ DragSendDataProc ÇÃíÜÇ≈çsǧDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB
ÉhÉçÉbÉvà íuÇÃéÊìæ
Ç‹Ç∏ëÊ 1 Ç…ÅADragSendDataProc ÇÕÉhÉâÉbÉOÇÃéÛêMë§Ç™ÉtÉ@ÉCÉãÇïKóvÇΔÇ∑ÇÈèÍèäÇå©Ç¬ÇØÇÈïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÃÇΩÇflÇ…ÇÕÅAGetDropLocation ÇåƒÇ—èoǵNjÇ∑ÅBDZÇÃåƒÇ—èoǵÇÕ AEDesc ÉåÉRÅ[ÉhÇçÏê¨ÇµÇ‹Ç∑ÅBDZÇÃÉåÉRÅ[ÉhÇ…ä‹Ç‹ÇÍÇÈÉfÅ[É^ÇÃå^ÇÕÅAÉhÉâÉbÉOÇÃéÛêMë§Ç…ÇÊǡǃíËã`Ç≥ÇÍÇ‹Ç∑ÅBÇΩÇΔǶnjÅAFinder ÇÕ typeAlias ÉfÅ[É^ÇÉhÉçÉbÉvà íuÇ…íuÇ´Ç‹Ç∑ÅBDZÇÃÉfÅ[É^Ç FSSpec Ç…ïœä∑Ç∑ÇÈÇ…ÇÕÅAǪÇÃå^Çã≠êßìIÇ… typeFSS DžǵǃÅAï‘Ç≥ÇÍÇÈãLèqéqÇ… FSSpec ÉfÅ[É^ÇÉRÉsÅ[ǵNjÇ∑ÅB
ÉRÅ[Éh #6: ÉhÉçÉbÉvÉtÉHÉãÉ_ÇíäèoÇ∑ÇÈ
pascal OSErr GetDropDirectory (DragReference dragRef, FSSpecPtr fssOut)
{
OSErr err = noErr;
AEDesc dropLocAlias = { typeNull, nil };
if (!(err = GetDropLocation (dragRef, &dropLocAlias)))
{
if (dropLocAlias.descriptorType != typeAlias)
err = paramErr;
else
{
AEDesc dropLocFSS = { typeNull, nil };
if (!(err = AECoerceDesc(&dropLocAlias, typeFSS, &dropLocFSS)))
{
// MinimumBytesForFSSpec ÇÕÉÅÉÇÉäÇà⁄ìÆÇµÇ»Ç¢ÇΔâºíËÇ∑ÇÈ
FSSpecPtr fss = (FSSpecPtr) *(dropLocFSS.dataHandle);
BlockMoveData (fss, fssOut, MinimumBytesForFSSpec(fss));
// MinimumBytesForFSSpec DžǬǢǃÇÕÅAÉRÅ[Éh #3 ÇéQèΔ
err = AEDisposeDesc (&dropLocFSS);
}
}
if (dropLocAlias.dataHandle)
{
OSErr err2 = AEDisposeDesc (&dropLocAlias);
if (!err) err = err2;
}
}
return err;
}
|
íçà”:
FSSpec ÉfÅ[É^ÇÕÉfÉBÉåÉNÉgÉäÇãLèqǵNjÇ∑ÅBǬNjÇËÅAÉtÉ@ÉCÉãÇÃçÏê¨Ç…égǧDZÇΔÇÃÇ≈Ç´ÇÈ FSSpec Ç≈ÇÕdžÇËÇ‹ÇπÇÒÅBçÏê¨ÇµÇÊǧÇΔÇ∑ÇÈÉtÉ@ÉCÉãÇ…ëŒÇ∑ÇÈÉfÉBÉåÉNÉgÉä ID ÇéÊìæÇ∑ÇÈÇ…ÇÕÅAÅuïtò^ CÅvÇÃä÷êîÇÃÇÊǧDž PBGetCatInfo ÇégǢNjÇ∑ÅB
|
ÉhÉçÉbÉvà íuÇÃÉfÅ[É^Ç™ typeAlias Ç≈ǻǢèÍçáÅAAECoerceDesc åƒÇ—èoǵÇÕê≥èÌÇ…èIóπǵNjÇπÇÒÅBǮǪÇÁÇ≠DZÇÃèÛãµÇ≈ÇÕÅADragSendDataProc ÇÕÉfÅ[É^ÇíÒãüÇπÇ∏ÅAÉGÉâÅ[Çï‘ǵNjÇ∑ÅBǵǩǵÅAFinder à»äOÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕé©óRÇ… typeAlias ÇÃÉhÉçÉbÉvà íuÇíÒãüÇ≈Ç´ÇÈì_Ç…íçà”ǵǃÇ≠ÇæÇ≥Ç¢ (ǵǩLJàÍïîÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕé¿ç€Ç…ǪÇÍÇçsǢNjÇ∑)ÅBDZÇÃÇΩÇflÅAtypeAlias ÇÕÅAFinder Ç™ÉhÉçÉbÉvÇÃéÛêMë§Ç≈džÇÈDZÇΔÇé¶ÇµÇƒÇ¢ÇÈÇΔÅAñ≥èåèÇ…îªífǵǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅB
íçà”:
åªç› Finder Ç…ÇÕÅAflavorTypePromiseHFS ÇÉhÉçÉbÉvÇ∑ÇÈèÍèäÇÃåàíËÇ…ä÷òAÇ∑ÇÈÇ¢Ç≠ǬǩÇÃÉoÉOǙdžÇËÇ‹Ç∑ÅBÉtÉHÉãÉ_ÇÃÉGÉCÉäÉAÉXÅAÉSÉ~î†ÇÃÉGÉCÉäÉAÉXÅAÇ®ÇÊÇ— PromiseHFSFlavor ÉåÉRÅ[ÉhÇ…é¶Ç≥ÇÍÇΩÉtÉ@ÉCÉãÉ^ÉCÉvÇéÛÇØì¸ÇÍÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅAdžÇΩǩLJÉhÉâÉbÉOÇéÛÇØì¸ÇÍÇÈÇ©ÇÃÇÊǧDžÉnÉCÉâÉCÉgï\é¶Ç≥ÇÍÇ‹Ç∑ÅBǵǩǵÅAÉ}ÉEÉXÉ{É^ÉìÇó£Ç∑ÇΔÇ´ÅADZÇÍÇÁÇÕÉhÉâÉbÉOÇãëê‚ǵNjÇ∑ÅBå„é“ÇÃèÍçá (ÉAÉvÉäÉPÅ[ÉVÉáÉì)ÅAÉhÉçÉbÉvà íuÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìÉtÉ@ÉCÉãǪÇÃLJÇÃÇÃÉGÉCÉäÉAÉXÇ…Ç»ÇËÇ‹Ç∑ÅBDZÇÃñ‚ëËÇ…ëŒèàÇ∑ÇÈǧNjǢï˚ñ@ÇÕdžÇËÇ‹ÇπÇÒÅB
|
íçà”:
ÉhÉçÉbÉvà íuÇ…ÇÊǡǃéwíËǵÇΩÉ{ÉäÉÖÅ[ÉÄÇΔÇÕàŸÇ»ÇÈÉ{ÉäÉÖÅ[ÉÄÇ…ÉtÉ@ÉCÉãÇçÏê¨ÇµÇ»Ç¢Ç≈Ç≠ÇæÇ≥Ç¢ÅBFinder ÇÕDZÇÃÉtÉ@ÉCÉãÇÉhÉçÉbÉvà íuÇ…ÉRÉsÅ[ǵNjÇπÇÒÅB
|
ÉtÉ@ÉCÉãÇÃçÏê¨
ÉtÉ@ÉCÉãÇíuÇ≠èÍèäÇ™åàíËǵÇΩÇÁÅAéüÇÃÇÊǧǻä÷êîÇåƒÇ—èoǵǃÉtÉ@ÉCÉãÇçÏê¨Ç∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB
ÉRÅ[Éh #7: ñÒë©ÇµÇΩÉtÉ@ÉCÉãÇ‹ÇΩÇÕÉtÉHÉãÉ_ÇçÏê¨Ç∑ÇÈ
pascal OSErr CreatePromisedFileOrFolder
(const PromiseHFSFlavor *phfs, const FSSpec *fss, ScriptCode scriptTag)
{
OSErr err = noErr;
if (phfs->promisedFlavor == kPromisedFlavorFindFile)
err = paramErr;
else if (phfs->fileType == 'disk')
err = paramErr;
else if (phfs->fileType == 'fold')
err = CreatePromisedFolder (phfs, fss, scriptTag); // ÉRÅ[Éh #9 ÇéQèΔ
else
err = CreatePromisedFile (phfs, fss, scriptTag); // ÉRÅ[Éh #8 ÇéQèΔ
return err;
}
|
ÉRÅ[Éh #8: ÉRÅ[Éh #7 Ç…ÇÊǡǃåƒÇ—èoÇ≥ÇÍÇÈä÷êî
static pascal CreatePromisedFile
(const PromiseHFSFlavor *phfs, const FSSpec *fss, ScriptCode scriptTag)
{
OSErr err = noErr;
if (!(err = FSpCreate(fss, phfs->fileCreator, phfs->fileType,scriptTag)))
{
if (phfs->fdFlags)
{
FInfo finderInfo;
if (!(err = FSpGetFInfo (fss, &finderInfo)))
{
finderInfo.fdFlags = phfs->fdFlags;
err = FSpSetFInfo (fss, &finderInfo);
}
}
}
return err;
}
|
ÉRÅ[Éh #9: ÉRÅ[Éh #7 Ç…ÇÊǡǃåƒÇ—èoÇ≥ÇÍÇÈä÷êî
static pascal CreatePromisedFolder
(const PromiseHFSFlavor *phfs, const FSSpec *fss, ScriptCode scriptTag)
{
OSErr err = noErr;
long newDirID; // ÉXÉ^Å[ÉgÉâÉCÉì
if (!(err = FSpDirCreate (fss, scriptTag, &newDirID)))
{
if (phfs->fdFlags)
{
DInfo finderInfo;
// FSpGetDInfo ÇΔ FSpSetDInfo DžǬǢǃÇÕÅAïtò^ BÇéQèΔ
if (!(err = FSpGetDInfo (fss, &finderInfo)))
{
finderInfo.frFlags = phfs->fdFlags;
err = FSpSetDInfo (fss, &finderInfo);
}
}
}
return err;
}
|
ÉtÉ@ÉCÉãèëÇ´çûÇ›ÇÃâÑä˙
ÉtÉ@ÉCÉãÇçÏê¨ÇµÇΩÇÁÅAǪÇÃì‡óeÇ DragSendDataProc Ç…èëÇ´çûÇfiǩǫǧǩÇåàíËǵNjÇ∑ÅBÉtÉ@ÉCÉãÇÃÉTÉCÉYÇ™ëÂǴǩǡÇΩÇËÅAÉAÉvÉäÉPÅ[ÉVÉáÉìǙǪÇÃå„Ç≈ÉtÉ@ÉCÉãì‡ÇÃÉfÅ[É^Çê∂ê¨Ç∑ÇÈïKóvǙdžÇÈÇΔÇ´ÇÕÅAÉtÉ@ÉCÉãÇÃèëÇ´çûÇ›ÇâÑä˙Ç≥ÇπÇ‹Ç∑ÅBDrag Manager ÇÃÉRÅ[ÉãÉoÉbÉNíÜÇÕÉRÉìÉeÉLÉXÉgÉXÉCÉbÉ`Ç™ñ≥å¯Ç…ǻǡǃǢÇÈÇΩÇflÅAâºÇ…ÉtÉ@ÉCÉãÇÃèëÇ´çûǛDžéûä‘ÇîÔǂǵÇΩÇΔǵǃLJÅAëºÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕé¿çséûä‘ÇéÊìæÇ≈Ç´Ç‹ÇπÇÒÅBÇΩÇΔǶÅAWaitNextEvent ÇÃé¸ä˙ìIÇ»åƒÇ—èoǵǙà¿ëSÇæÇΔǵǃLJ (é¿ç€Ç…ÇÕà¿ëSÇ≈ÇÕdžÇËÇ‹ÇπÇÒ)ÅAìØólÇ≈Ç∑ÅB
DZÇÃÇÊǧǻèÛãµÇ≈ÇÕÅADragSendDataProc Ç≈ÉtÉ@ÉCÉãÇäJÇ´ÅAǪÇÍÇäJÇ¢ÇΩNjNjDžǵǃǮǴNjÇ∑ÅBÇ≥ÇÁÇ…ÅAì‡ïîÉXÉeÅ[É^ÉXïœêîÇÉZÉbÉgǵǃÅAÉtÉ@ÉCÉãÇÃèëÇ´çûÇ›ÇïKóvÇΔÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃëºÇÃïîï™Ç…LJǪÇÃDZÇΔÇì`ǶNjÇ∑ÅBTrackDrag Ç™ñflÇËílÇï‘ǵÇΩå„Ç≈ÅAWaitNextEvent Çé¸ä˙ìIÇ…åƒÇ—èoǵǃÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃëºÇÃïîï™Ç…ÉtÉ@ÉCÉãÇÃèëÇ´çûÇ›ÇçsÇÌÇπÇ‹Ç∑ÅB
ÉhÉâÉbÉOÇÃèIóπ
ÉtÉ@ÉCÉãÇ™ê≥èÌÇ…çÏê¨Ç≥ÇÍÇΩÇÁ (ǪǵǃÅAǪÇÃèÍçáÇÃÇ›)ÅAÉhÉâÉbÉOÇÃéÛêMë§Ç…ÉtÉ@ÉCÉãñºÇΔÉtÉ@ÉCÉãÇ™çÏê¨Ç≥ÇÍÇΩèÍèäÇîFéØÇ≥ÇπÇ‹Ç∑ÅBDZÇÃèàóùÇçsǧDžÇÕÅASetItemFlavorData ÇåƒÇ—èoǵNjÇ∑ÅBFlavorType ÉpÉâÉÅÅ[É^Ç…ÇÕÅAPromiseHFSFlavor ÉåÉRÅ[ÉhÇà promisedFlavor ÉtÉBÅ[ÉãÉhÇÃílÇìnǵNjÇ∑ÅBÉtÉåÅ[ÉoÅ[ÉfÅ[É^Ç…ÇÕÅAÉtÉ@ÉCÉãÇÃñºëOÇΔï€ë∂èÍèäÇãLèqÇ∑ÇÈ FSSpec ÉåÉRÅ[ÉhÇìnǵNjÇ∑ÅBpromisedFlavor ÉfÅ[É^ÇÕÅAèÌÇ… HFSFlavor Ç≈ÇÕÇ»Ç≠ÅAFSSpec Ç≈Ç»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBéüÇÃÉRÅ[ÉhÇÕÅAÉfÅ[É^Çê≥ǵÇ≠í«â¡Ç∑ÇÈíPèÉÇ»éËë±Ç´Ç©ÇÁç\ê¨Ç≥ÇÍǃǢNjÇ∑ÅB
ÉRÅ[Éh #10: ñÒë©ÇµÇΩ FSSpec Çí«â¡Ç∑ÇÈ
pascal OSErr SetPromisedHFSFlavorData
(DragReference dragRef, ItemReference itemRef,
const PromiseHFSFlavor *phfs, const FSSpec *fss)
{
return SetDragItemFlavorData
(dragRef, itemRef, phfs->promisedFlavor, fss, sizeof(*fss), 0);
}
|
ÅgÉtÉ@ÉCÉãåüçıÅhÇÃñäÑ
ä˘ë∂ÇÃÉtÉ@ÉCÉãÇéQèΔÇ∑ÇÈ DragReference ÇíÒãüÇ∑ÇÈïKóvǙdžÇËÅAǪÇÍÇ™â¬î\Ç»èÍçáÇÕÅAflavorTypeHFS ÇëóêMǵǃÇ≠ÇæÇ≥Ç¢ÅBǵǩǵÅAÇ‚ÇfiÇǶÇ∏ÅAǪÇÃë„ÇÌÇËÇ… flavorTypePromiseHFS ÇëóêMÇ∑ÇÈÇΔÇ´ÇÕÅAéüÇÃì_ÇämîFǵǃÇ≠ÇæÇ≥Ç¢ÅB
PromiseHFSFlavor ÉåÉRÅ[ÉhÇà promisedFlavor ÉtÉBÅ[ÉãÉhÇ 'rWm1' (0x72576D31) Ç…ê›íËǵNjÇ∑ÅB
Drag Manager Ç™ DragSendDataProc Ç… 'rWm1' ÉfÅ[É^ÇóvãÅǵÅAGetDropLocation Ç™ descriptorType ÉtÉBÅ[ÉãÉhÇ… typeNull Çä‹Çfi AEDesc ÇçÏê¨Ç∑ÇÈÇΔÇ´Ç…ÇÕÅAÉtÉ@ÉCÉãÇÃÉIÉäÉWÉiÉãÇÃà íuÇíÒãüǵNjÇ∑ÅB
GetDropLocation Ç™ descriptorType ÉtÉBÅ[ÉãÉhÇ… typeAlias Çä‹Çfi AEDesc ÇçÏê¨Ç∑ÇÈÇΔÇ´Ç…ÇÕÅAÉtÉ@ÉCÉãÇÉhÉçÉbÉvà íuÇ…ÉRÉsÅ[ǵNjÇ∑ÅB'rWm1' ÇÕÅAÉhÉâÉbÉOÇÃéÛêMë§Ç÷ÇÃÉqÉìÉgÇ…Ç∑ǨNjÇπÇÒÇ™ÅADZÇÃÉqÉìÉgÇéÊÇËãéǡǃÇÕÇ¢ÇØÇ‹ÇπÇÒÅB
èdóv:
DZÇÍÇÁÇÃÉXÉeÉbÉvÇÕÇ∑Ç◊ǃÇÃÉhÉâÉbÉOçÄñ⁄Ç…ëŒÇµÇƒé¿çsÇ∑ÇÈÇ©ÅAÇ¢Ç∏ÇÍÇÃçÄñ⁄DžLJé¿çsǵǻǢÇÊǧDžǵNjÇ∑ÅBàÍïîÇÃçÄñ⁄ÇæÇØÇëŒè€Ç…é¿çsǵǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅB
|
DZÇà TECHNOTE ÇÃÅuÉtÉ@ÉCÉãåüçıÇégÇ¡ÇΩÉRÉsÅ[ÅvÇ≈ÇÕÅAÇ»Ç∫DZÇÍÇÁÇÃÉXÉeÉbÉvÇ™ïKóvÇ»ÇÃǩDžǬǢǃè⁄ǵÇ≠ê‡ñæÇµÇ‹Ç∑ÅBéüÇÃÉRÅ[ÉhÇÕÅAåƒÇ—èoǵå≥Ç™ÉhÉçÉbÉvÇ∑ÇÈÉtÉ@ÉCÉãÇÉRÉsÅ[Ç∑ÇÈǩǫǧǩÇåƒÇ—èoǵå≥Ç…ämîFÇ∑ÇÈìπãÿÇÉCÉìÉvÉäÉÅÉìÉgǵǃǢNjÇ∑ÅB
ÉRÅ[Éh #11: ÉhÉçÉbÉvÇ≥ÇÍÇΩÉtÉ@ÉCÉãÇÉRÉsÅ[Ç∑ÇÈǩǫǧǩÇåàíËÇ∑ÇÈ
pascal OSErr ShouldCopyToDropLoc
(DragReference dragRef, FlavorType promisedFlavor, Boolean *shouldCopy)
{
OSErr err = noErr;
AEDesc dropLoc = { typeNull, nil };
*shouldCopy = false;
if (!(err = GetDropLocation (dragRef, &dropLoc)))
{
if (dropLoc.descriptorType == typeAlias)
{
// ÉqÉìÉgǻǵÅAÇ‹ÇΩÇÕéÛêMë§ÇÕǪÇÍÇå©Ç¬ÇØÇÈDZÇΔÇ™Ç≈ǴǻǢ
*shouldCopy = true;
}
else if (dropLoc.descriptorType != typeNull)
{
// ñ¢ímÇÃÉhÉçÉbÉvà íuãLèqéqÇÃå^
err = paramErr;
}
else if (promisedFlavor != kPromisedFlavorFindFile)
{
// null ãLèqéqÇæÇ™ÅAó\ä˙Ç≥ÇÍÇΩÉqÉìÉgǻǵ (DragPeeker)
err = dirNFErr;
}
if (dropLoc.dataHandle)
{
OSErr err2 = AEDisposeDesc (&dropLoc);
if (!err) err = err2;
}
}
return err;
}
|
flavorTypePromiseHFS ÇÃéÛêM
ÇΩǢǃǢÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅAflavorTypePromiseHFS ÉfÅ[É^ÇéÛÇØéÊÇÈïKóvÇÕdžÇËÇ‹ÇπÇÒÅBÇŸÇΔÇÒÇ«ÇÃèÍçáÅAflavorTypeHFS Ç≈è\ï™Ç≈Ç∑ÅBëΩÇ≠ÇÃëóêMë§Ç™ flavorTypeHFS ÇíÒãüǵNjÇ∑Ç™ÅAè≠Ç»Ç≠ÇΔLJ 1 ǬÅAflavorTypePromiseHFS ÇíÒãüÇ∑ÇÈèdóvÇ»ÉAÉvÉäÉPÅ[ÉVÉáÉì (ÅgÉtÉ@ÉCÉãåüçıÅh) ǙdžÇËÇ‹Ç∑ÅBÇ¢Ç∏ÇÍÇ…ÇπÇÊÅAflavorTypePromiseHFS Ç…òJóÕÇåXÇØÇÈëOÇ…ÅAflavorTypeHFS ÇÃDZÇΔÇêTèdÇ…åüì¢ÇµÇƒÇ≠ÇæÇ≥Ç¢ÅB
2 ǬÇÃÉtÉåÅ[ÉoÅ[ÇÃéÊìæ
ÉhÉâÉbÉOí«ê’ÉnÉìÉhÉâ (Drag Tracking HandlerFlavor ) Ç≈ÇÕÅAPromiseHFSFlavor Ç≈džÇÈ flavorTypePromiseHFS ÉfÅ[É^ÇéÊìæÇµÇƒÇ‡Ç©Ç‹Ç¢Ç‹ÇπÇÒÇ™ÅApromised ÉfÅ[É^ÇéÊìæÇµÇ»Ç¢Ç≈Ç≠ÇæÇ≥Ç¢ÅBÉhÉâÉbÉOí«ê’ÉnÉìÉhÉâÇ≈ÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìì‡ÇÃéwíËÇ≥ÇÍÇΩÉEÉBÉìÉhÉEÇ™ÉfÅ[É^ÇÃãÜã…ÇÃéÛêMë§Ç≈džÇÈǩǫǧǩÇîFéØÇ∑ÇÈDZÇΔÇÕÇ≈Ç´Ç‹ÇπÇÒÅBǬNjÇËÅAãÜã…ÇÃéÛêMë§ÇÕÅAǪÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃï ÇÃÉEÉBÉìÉhÉEÇ≈džÇÈDZÇΔLJdžÇÍÇŒÅAï ÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉEÉBÉìÉhÉEÇ≈džÇÈDZÇΔLJdžÇËÇ‹Ç∑ÅBÉhÉâÉbÉOí«ê’ÉnÉìÉhÉâÇ™ flavorTypePromiseHFS ÉfÅ[É^ÇóvãÅÇ∑ÇÈèÍçáÅADrag Manager ÇÕëóêMë§Çà SendDataProc ÇåƒÇ—èoǵÅAǪÇÃå„ÅAÉfÅ[É^ÇÕ DragReference Ç…ÉLÉÉÉbÉVÉÖÇ≥ÇÍÇ‹Ç∑ÅBǪÇÃåãâ ÅAëºÇÃêˆç›ìIÇ»éÛêMë§Ç™ÉLÉÉÉbÉVÉÖÇ≥ÇÍÇΩÉfÅ[É^ÇéÊìæÇ∑ÇÈDZÇΔÇ…Ç»ÇËÅAëóêMë§ÇÕÉåÉVÅ[ÉoÇÃÉhÉçÉbÉvà íuÇ…è]ǡǃÅAǪÇÃÉfÅ[É^Çí≤êÆÇ∑ÇÈÉ`ÉÉÉìÉXÇé∏ǡǃǵNjǢNjÇ∑ÅB
ÉhÉâÉbÉOéÛêMÉnÉìÉhÉâ (Drag Receive Handler ) Ç≈ÇÕÅAflavorTypePromiseHFS ÉfÅ[É^ÇΔ promisedFlavor ÉfÅ[É^ÇÃóºï˚ÇéÊìæÇ∑ÇÈÇÃÇ™à¿ëSÇ≈Ç∑ÅBÇΩÇæÇµÅApromisedFlavor ÉfÅ[É^ÇÉäÉNÉGÉXÉgÇ∑ÇÈëOÇ…ÅAïKÇ∏ SetDropLocation ÇåƒÇ—èoǵǃÇ≠ÇæÇ≥Ç¢ÅBéüÇÃÉRÅ[ÉhÇÕÅADZÇÃÉvÉçÉZÉXÇä«óùÇ∑ÇÈä÷êîÇ≈Ç∑ÅBÉtÉHÉãÉ_ÉpÉâÉÅÅ[É^ÇÕ NIL ÇÃèÍçáLJdžÇËÇ‹Ç∑ÅBDZÇÍÇÕÅAåƒÇ—èoǵå≥Ç™ÉtÉ@ÉCÉãåüçıÇÉTÉ|Å[ÉgǵǃǢÇÈÇΔǢǧà”ñ°Ç≈Ç∑ÅBDZÇÃä÷êîǙǫÇÃÇÊǧDžìÆçÏǵÅAÇ»Ç∫DZÇÃä÷êîÇé¿çsÇµÇ»ÇØÇÍnjǻÇÁǻǢǩDžǬǢǃÇÕå„èqǵNjÇ∑ÅB
ÉRÅ[Éh #12: flavorTypeHFS ÇÃéÛêM
pascal OSErr ReceivePromisedFile
(DragReference dragRef, ItemReference itemRef,
HFSFlavor *hfsFlavor, const FSSpec *folder)
{
OSErr err = noErr;
if (folder)
// SetDropFolder DžǬǢǃÇÕÅAÉRÅ[Éh #13 ÇéQèΔ
err = SetDropFolder (dragRef,folder);
if (!err)
{
// 'isSupposedlyFromFindFile' DžǬǢǃÇÕå„èq
Boolean isSupposedlyFromFindFile = (folder == nil);
err = GetHFSFlavorFromPromise // ÉRÅ[Éh #14 ÇéQèΔ
(dragRef, itemRef, hfsFlavor, isSupposedlyFromFindFile);
}
return err;
}
|
ÉhÉçÉbÉvà íuÇÃê›íË
flavorTypePromiseHFS ÇéÛêMÇ∑ÇÈÉvÉçÉZÉXÇÃíÜÇ≈LJÅADZÇÃïîï™ÇÕî‰ärìIä»íPÇ≈Ç∑ÅBÇ‹Ç∏ÅAÉhÉçÉbÉvà íuÇÃÉGÉCÉäÉAÉXÇçÏê¨ÇµÇ‹Ç∑ÅBflavorTypePromiseHFS ÇÃèÍçáÅADZÇÍÇÕèÌÇ…ÉfÉBÉåÉNÉgÉäÇ…Ç»ÇÈÇÕÇ∏Ç≈Ç∑ÅBéüÇ…ÅAǪÇÃÉGÉCÉäÉAÉXÇ AEDesc ÇÃíÜÇ…ÉRÉsÅ[ǵNjÇ∑ÅBǪǵǃç≈å„Ç…ÅASetDropLocation ÇåƒÇ—èoǵNjÇ∑ÅBDZÇÃéËë±Ç´ÇÕÅAéüÇÃÉRÅ[ÉhÇ≈ãÔëÃìIÇ…ê‡ñæÇ≥ÇÍǃǢNjÇ∑ÅB
ÉRÅ[Éh #13: ÉRÅ[Éh #12 Ç…ÇÊǡǃåƒÇ—èoÇ≥ÇÍÇÈä÷êî
static pascal OSErr SetDropFolder
(DragReference dragRef, const FSSpec *folder)
{
OSErr err = noErr;
AliasHandle aliasH;
if (!(err = NewAliasMinimal (folder, &aliasH)))
{
HLockHi ((Handle) aliasH);
if (!(err = MemError ( )))
{
Size size = GetHandleSize ((Handle) aliasH);
if (!(err = MemError ( )))
{
AEDesc dropLoc;
if (!(err = AECreateDesc
(typeAlias, *aliasH, size, &dropLoc)))
{
OSErr err2;
err = SetDropLocation (dragRef, &dropLoc);
err2 = AEDisposeDesc (&dropLoc);
if (!err) err = err2;
}
}
}
DisposeHandle ((Handle) aliasH);
if (!err) err = MemError ( );
}
return err;
}
|
ÉtÉ@ÉCÉãåüçıÇégÇ¡ÇΩÉRÉsÅ[
ëΩÇ≠ÇÃÉhÉâÉbÉOéÛêMë§Ç≈ÇÕÅAÉtÉ@ÉCÉãåüçıÇÃåüçıåãâ ÉEÉBÉìÉhÉEÇ©ÇÁÉhÉâÉbÉOÇ≥ÇÍÇΩÉfÅ[É^ÇéÛêMÇ≈Ç´ÇÈDZÇΔÇ™ñ]NjǵǢÇΔǢǶNjÇ∑ÅBëÂïîï™ÇÃÉfÉxÉçÉbÉpÇ™ DragReference ì‡Ç≈åüçıǵÇÊǧÇΔÇ∑ÇÈëÊ 1 ÇÃÉtÉåÅ[ÉoÅ[ÇÕÅAflavorTypeHFS Ç≈džÇÈÇΔévÇÌÇÍÇ‹Ç∑ÅBǵǩǵÅAÉtÉ@ÉCÉãåüçıÇÕÅADZÇà TECHONOTE Ç≈èqÇ◊ÇΩ Finder ÇÃÉoÉOÇ…ëŒèàǵÇÊǧÇΔǵǃÅAflavorTypeHFS Ç≈ÇÕÇ»Ç≠ flavorTypePromiseHFS ÇíÒãüǵNjÇ∑ÅB
ÉtÉ@ÉCÉãåüçıÇÃïsãÔçáÇÃñ{éø
ÉtÉ@ÉCÉãåüçıÇÕÅAFinder ÇÃì‡ïîÇ≈ÇÕǩǻÇËǧNjÇ≠ìÆçÏǵNjÇ∑Ç™ÅAflavorTypePromiseHFS ÇéÛêMÇ∑ÇÈëºÇÃëΩÇ≠ÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇΔÇÕǧNjÇ≠ìÆçÏǵNjÇπÇÒÅBä˘Ç…èqÇ◊ÇΩÇÊǧDžÅAflavorTypePromiseHFS ÇÕÇ‹Çæë∂ç›ÇµÇƒÇ¢Ç»Ç¢ÉtÉ@ÉCÉãÇçÏê¨Ç∑ÇÈÇΩÇflÇÃñÒë©Ç≈Ç∑Ç™ÅAÉtÉ@ÉCÉãåüçıÇÃåüçıåãâ ÉEÉBÉìÉhÉEÇ…ÇÕä˘ë∂ÇÃÉtÉ@ÉCÉãÇæÇØÇ™ï\é¶Ç≥ÇÍÇ‹Ç∑ÅBDZÇÃÇΔÇ´ÅAÉZÉ}ÉìÉeÉBÉbÉNÇ»ñµèÇÇ™î≠ê∂ǵNjÇ∑ÅBDZDZÇ≈ÇÕÅAãÔëÃó·Çí ǵǃÅAÇ«ÇÃÇÊǧDžǵǃDZÇÃñµèÇÇ™ñ‚ëËÇÃå¥àˆÇ…Ç»ÇÈÇÃÇ©ÇíTǡǃǛNjǵÇÂǧÅB
ìdéqÉÅÅ[ÉãÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ÉÅÉbÉZÅ[ÉWÇ÷ÇÃìYïtï®ÇΔǵǃ flavorTypePromiseHFS ÇéÛÇØì¸ÇÍÅAÉhÉâÉbÉOÇÃëóêMë§Ç™Ç±Çà TECHNOTE Ç≈ê‡ñæÇµÇΩ flavorTypePromiseHFS ÇÃà”ñ°ÇêSìæÇƒÇ¢ÇÈÇΔâºíËǵNjÇ∑ÅBDZÇÃÇΔÇ´ÅAìdéqÉÅÅ[ÉãÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉhÉçÉbÉvà íuÇǪÇÃëóêMÉXÉvÅ[ÉãÉtÉHÉãÉ_Ç…ê›íËǵÅAä÷òAÇ√ÇØÇÁÇÍÇΩÉÅÉbÉZÅ[ÉWÇ™ê≥èÌÇ…ëóêMÇ≥ÇÍÇΩÇΔÇ´Ç…ÅAǪÇÃÉtÉ@ÉCÉãÇçÌèúǵÇÊǧÇΔǵNjÇ∑ÅBǪÇÃåãâ ÅAflavorTypePromiseHFS ÇÃà”ñ°ÇÕÅAéÛêMë§ÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™îrëºìIÇ…égópÇ∑ÇÈÇΩÇflÇ…ÉtÉ@ÉCÉãÇçÏê¨Ç∑ÇÈÇΔǢǧDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB
ǵǩǵÅAǪÇÃë„ÇÌÇËÇ…ÉtÉ@ÉCÉãåüçıǙǪÇÃÉXÉvÅ[ÉãÉtÉHÉãÉ_Ç…ä˘ë∂ÇÃÉtÉ@ÉCÉãÇíPèÉÇ…à⁄ìÆÇ∑ÇÈèÍçáÅAìdéqÉÅÅ[ÉãÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕǪÇÃÉfÅ[É^ÇÃÉRÉsÅ[Ç 1 ǬçÌèúǵǃǵNjǢNjÇ∑ÅBdžÇÈÇ¢ÇÕè≠Ç»Ç≠ÇΔLJÅAÉtÉ@ÉCÉãåüçıÇÕÉÜÅ[ÉUÇ™ó\ä˙ǵǻǢÅAÇ‹ÇΩÇÕóùâÇ≈ǴǻǢèÍèäÇ…ÉtÉ@ÉCÉãÇà⁄ìÆÇµÇƒÇµÇ‹Ç¢Ç‹Ç∑ÅBDZÇÍÇÕÉtÉ@ÉCÉãåüçıÇÃé¿ç€ÇÃìÆçÏÇ≈Ç∑ÅB
Ç»Ç∫DZÇÃÇÊǧǻDZÇΔÇ™ãNDZÇÈÇ©ÇΔǢǶnjÅAFinder Ç…ÇÕÉoÉOǙdžÇÈÇΩÇflÅAÉtÉ@ÉCÉãåüçıÇÕÉhÉçÉbÉvÇ™î≠ê∂ǵÇΩDZÇΔÇ Finder Ç…î[ìæÇ≥ÇπÅAÉhÉçÉbÉvÇ≥ÇÍÇΩÉtÉ@ÉCÉãÇçÌèúǵNjÇ∑ÅBÇ≥ÇÁÇ… Finder Ç… AppleEvent ÇëóêMǵÅAíPìΔÇ≈ flavorTypeHFS ÇèàóùÇ≥ÇπÇ‹Ç∑ÅBÉtÉ@ÉCÉãåüçıÇ™ Finder Ç©ÇÁìæÇΩÇ¢ÉfÅ[É^ÇÕÉhÉçÉbÉvà íuÇæÇØÇ≈Ç∑ÅB
DZDZÇ≈ê‡ñæÇµÇΩï‚ë´èÓïÒÇΔÇÕä÷åWÇ»Ç≠ÅAäJî≠Ç∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅADZÇà TECHNOTE ÇÃäeÉZÉNÉVÉáÉìÇÃì‡óeÇ…Ç≈Ç´ÇÈǩǨÇËåµñßÇ…èÄãíǵǃǢÇÈïKóvǙdžÇËÇ‹Ç∑ÅB
|
ÉtÉ@ÉCÉãåüçıÇÇflÇÆÇÈñ‚ëË
ÉtÉ@ÉCÉãåüçıÇÃÉGÉìÉWÉjÉAÇÕÅAäÛñ]í ÇËÇ…ìÆçÏÇ≥ÇπÇÈÇΩÇflÇ… Finder Ç…ñ≥óùÇã≠Ç¢ÇÈDZÇΔÇÕdžÇËÇ‹ÇπÇÒÇ≈ǵÇΩÅBǵǩǵÅAëºÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ HFS Ç…ä÷òAǵÇΩÉhÉâÉbÉOÇïqä¥Ç…éÛêMÇ∑ÇÈÇΩÇflÇÃï˚ñ@ÇíÒãüǵǃǢNjÇ∑ÅBDZÇÍÇ‹Ç≈ÅADZÇÃDZÇΔÇÕÉ}ÉjÉÖÉAÉãÇ…èëÇ©ÇÍǃǢNjÇπÇÒÇ≈ǵÇΩÅB
ÉhÉâÉbÉOí«ê’ÉnÉìÉhÉâÇ≈ÇÕÅAflavorTypePromiseHFS ÉfÅ[É^ÇéÊìæÇµÇƒÅAǪÇà promisedFlavor ÉtÉBÅ[ÉãÉhÇ™ 'rWm1' (0x72576D31) Ç≈džÇÈǩǫǧǩÉ`ÉFÉbÉNǵǃÇ≠ÇæÇ≥Ç¢ÅBDZÇÍÇÕÅAÉtÉ@ÉCÉãåüçıÇ™èÌÇ…égópÇ∑ÇÈílÇ≈Ç∑ÅBpromisedFlavor ǙDZÇÃílDžǻǡǃǢÇÈèÍçáÇÕÅAÉtÉâÉOÇÉZÉbÉgǵǃÅAå„Ç≈ SetDropLocation ÇåƒÇ—èoÇ≥ǻǢÇÊǧDžǵNjÇ∑ÅB
ÉhÉâÉbÉOéÛêMÉnÉìÉhÉâÇ≈ÇÕÅApromisedFlavor ÉfÅ[É^ÇóvãÅÇ∑ÇÈëOÇ…ÅAí èÌÇÕ SetDropLocation ÇåƒÇ—èoǵNjÇ∑ÅBÇΩÇæÇµÅAÉtÉ@ÉCÉãåüçıÇ©ÇÁ flavorTypePromiseHFS ÉfÅ[É^ÇéÛêMǵǃǢÇÈèÍçáÇÕÅADZÇÃÉXÉeÉbÉvÇè»ó™ÇµÇƒÅADrag Manager Ç… promisedFlavor ÉfÅ[É^ÇóvãÅǵNjÇ∑ (Ç‡ÇøÇÎÇÒDZÇÃèÍçáLJÅApromisedFlavor ÇÕèÌÇ… 'rWm1' ÇΔǢǧílÇéùÇøÇ‹Ç∑)ÅBDZÇÍÇ…ÇÊÇËÅAÉtÉ@ÉCÉãåüçıÇ…ÉtÉ@ÉCÉãÇÃÉRÉsÅ[Ç‚à⁄ìÆÇÇ≥ÇπÇÈDZÇΔÇ»Ç≠ÅAFSSpec ÉfÅ[É^Ç™çÏê¨Ç≥ÇÍÇ‹Ç∑ÅB
flavorTypePromiseHFS ÉvÉçÉgÉRÉãÇ…ëŒÇ∑ÇÈDZÇÃÉoÉäÉAÉìÉgÇê≥èÌÇ…ìÆçÏÇ≥ÇπÇÈÇ…ÇÕÅAÉhÉâÉbÉOéÛêMÉnÉìÉhÉâÇÃíÜÇ≈ promisedFlavor ÉfÅ[É^ÇÉäÉNÉGÉXÉgÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÍÇÉhÉâÉbÉOí«ê’ÉnÉìÉhÉâÇÃíÜÇ≈ÉäÉNÉGÉXÉgÇ∑ÇÈÇΔÅAíPèÉÇ…ÉGÉâÅ[Ç™ï‘Ç≥ÇÍÇ‹Ç∑ÅB
DZDZNjÇ≈ÇÃê‡ñæÇ≈ÅApromisedFlavor ÇÃílǙǻÇ∫èdóvÇ»ÇÃÇ©ÇÕóùâÇ≈Ç´ÇÈÇÕÇ∏Ç≈Ç∑ÅBílÇ™ 'rWm1' Ç≈džÇÍÇŒÅAÉfÅ[É^ÇÕÉtÉ@ÉCÉãåüçıÇ…óRóàǵÅAǪÇÍà»äOÇÃíl ('fssP' [0x66737350] ÇÇ®ä©ÇflǵNjÇ∑Ç™ÅAÉvÉçÉOÉâÉÄÇ™ä˘Ç…ï ÇÃílÇégǡǃǢǃLJì¡Ç…ñ‚ëËÇÕdžÇËÇ‹ÇπÇÒ) Ç≈džÇÍÇŒÅAÉfÅ[É^ÇÕëºÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…óRóàǵNjÇ∑ÅBÉtÉ@ÉCÉãåüçıà»äOÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅAflavorTypePromiseHFS ÇÃñ{óàÇÃà”ñ°Ç…èÄãíÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB
éüÇÃÉRÅ[ÉhÇ≈ÇÕÅAÉtÉ@ÉCÉãåüçıÇ…ä÷Ç∑ÇÈç¨óêÇ™î≠ê∂ǵǻǢÇÊǧDžǢÇ≠ǬǩÇÃÉ`ÉFÉbÉNÇâ¡Ç¶ÇƒÅAóºï˚ÇÃÉtÉåÅ[ÉoÅ[ÇéÊìæÇ∑ÇÈï˚ñ@Çé¶ÇµÇƒÇ¢Ç‹Ç∑ÅB
ÉRÅ[Éh #14: ÉRÅ[Éh #12 Ç…ÇÊǡǃåƒÇ—èoÇ≥ÇÍÇÈä÷êî
static pascal OSErr GetHFSFlavorFromPromise
(DragReference dragRef, ItemReference itemRef,
HFSFlavor *hfs, Boolean isSupposedlyFromFindFile)
{
OSErr err = noErr;
PromiseHFSFlavor phfs;
Size size = sizeof (phfs);
err = GetFlavorData(dragRef, itemRef, flavorTypePromiseHFS, &phfs, &size, 0);
if (!err)
{
if (size != sizeof (phfs))
err = cantGetFlavorErr;
else
{
Boolean isFromFindFile =
phfs.promisedFlavor == kPromisedFlavorFindFile;
if (isSupposedlyFromFindFile != isFromFindFile)
err = paramErr;
else
{
size = sizeof (hfs->fileSpec);
err = GetFlavorData
(dragRef, itemRef, phfs.promisedFlavor,
&(hfs->fileSpec), &size, 0);
if (!err)
{
Size minSize = MinimumBytesForFSSpec(&(hfs->fileSpec));
// MinimumBytesForFSSpec DžǬǢǃÇÕÅAÉRÅ[Éh #3 ÇéQèΔ
if (size < minSize)
err = cantGetFlavorErr;
else
{
hfs->fileType = phfs.fileType;
hfs->fileCreator = phfs.fileCreator;
hfs->fdFlags = phfs.fdFlags;
}
}
}
}
}
return err;
}
|
óvñÒ
Drag Manager Ç…ä÷òAÇ√ÇØÇÁÇÍÇÈÉtÉ@ÉCÉãÉVÉXÉeÉÄÉIÉäÉGÉìÉeÉBÉbÉhÇ» 2 ǬÇÃÉtÉåÅ[ÉoÅ[É^ÉCÉvǙdžÇËÇ‹Ç∑ÅB1 ǬÇÕî‰ärìIíPèÉÇ»ÉtÉåÅ[ÉoÅ[Ç≈ÅAFinder ÇÃÉoÉOÇ…ëŒÇ∑ÇÈÇ¢Ç≠ǬǩÇÃëŒèàï˚ñ@ÇèúÇØÇŒÅAëºÇÃëÂïîï™ÇÃÉtÉåÅ[ÉoÅ[ÇΔìØólÇ…éÊÇËàµÇ§Ç±ÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBàÍï˚ÅALJǧ 1 ǬÇà flavorTypePromiseHFS ÇÕǮǪÇÁÇ≠ÅAÉfÉxÉçÉbÉpÇ™éÊÇËàµÇ§ÉtÉåÅ[ÉoÅ[ÇÃíÜÇ≈LJç≈LJï°éGǻLJÇÃÇ≈džÇËÅADZÇÍÇê≥ǵÇ≠ÉCÉìÉvÉäÉÅÉìÉgÇ∑ÇÈÇ…ÇÕÅAç◊êSÇÃíçà”ÇΔÇflÇÒǫǧǻëŒèàï˚ñ@Ç…ëŒÇ∑ÇÈóùâÇ™ïKóvÇ≈Ç∑ÅB
éüÇ…ÅALJǧàÍìxåJÇËï‘Ç∑âøílÇÃdžÇÈèdóvÇ»É|ÉCÉìÉgÇÇ‹ÇΔÇflǃǛNjÇ∑ÅB
- ä˘ë∂ÇÃÉtÉ@ÉCÉãÇ…ÇÕ
flavorTypeHFS ÇégǢNjÇ∑ÅBÇ‹ÇΩÅAÇ‹Çæë∂ç›ÇµÇƒÇ¢Ç»Ç¢Ç™ÅAçÏê¨ÇµÇΩÇ¢ÉtÉ@ÉCÉãÇ…ÇÕÅAflavorTypePromiseHFS ÇégǢNjÇ∑ÅB
- Drag Manager ÇÃÉtÉåÅ[ÉoÅ[ÉfÅ[É^ÇñÒë©Ç∑ÇÈÇΔǢǧäTîOÇΔÅA
flavorTypePromiseHFS ÇΔÇç¨ìØÇµÇ»Ç¢Ç≈Ç≠ÇæÇ≥Ç¢ÅBóºé“ÇΔLJ 1 ǬÇÃñÒë©Ç≈Ç∑Ç™ÅAñÒë©ÇÃéÌófiǙNjǡÇΩÇ≠àŸÇ»ÇËÇ‹Ç∑ÅB
- Ç∑Ç◊ǃÇÃÉGÉâÅ[ÉRÅ[ÉhÇÉ`ÉFÉbÉNǵÅAÉRÅ[ÉhÇÃíÜÇ…ÉAÉTÅ[ÉVÉáÉìÇëgÇ›çûÇÒÇ≈ÅAä˙ë“ǵÇΩìÆçÏÇ…è]ÇÌǻǢÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ñ‚ëËÇãNDZÇ∑ÇÃÇîÇØÇƒÇ≠ÇæÇ≥Ç¢ÅB
GetDropLocation ÇΔ SetDropLocation ÇǧNjÇ≠égǡǃÇ≠ÇæÇ≥Ç¢ÅB
- çÌèúǵÇÊǧÇΔévǡǃǢÇÈÉtÉ@ÉCÉãÇ…ëŒÇ∑ÇÈ
flavorTypePromiseHFS ÇéÛêMǵÇΩÇΔÇ´ÇÕÅAÉtÉ@ÉCÉãåüçıÇ™ä÷åWǵǃǢÇÈǩǫǧǩÇämîFǵÅAÉÜÅ[ÉUÇ™écǵǃǮǴÇΩÇ¢ÇΔévǡǃǢÇÈÉfÅ[É^Ç™îjâÛÇ≥ÇÍÇÈÇÃÇâÒîǵNjÇ∑ÅB
éQçlï∂å£
É_ÉEÉìÉçÅ[Éh
é”é´
éëóøÇÃé˚èWÇ©ÇÁÉeÉNÉjÉJÉãÉåÉrÉÖÅ[Ç‹Ç≈ÅADZÇà TECHNOTE ÇÃäÆê¨ÇéxâáǵǃÇ≠ÇÍÇΩóFêlÇΩÇøÇ…êSÇ©ÇÁä¥é”ǵNjÇ∑ÅBAndy BachorskiÅABrian BechtelÅASteve ChristensenÅASteve DornerÅADave EvansÅANitin GanatraÅAPeter LewisÅABill MonkÅAMatt MoraÅAPete ResnickÅALeonard RosentholÅARich SiegelÅAjud spencerÅAJames Thomson ÇÃǛǻÇ≥ÇÒÇ≈Ç∑ÅB
ïtò^
DZÇÃïtò^Ç≈ÇÕÅADZÇÍÇ‹Ç≈DždžÇ∞ÇΩÉRÅ[ÉhÇäÆëSÇ…óùâÇ∑ÇÈÇΩÇflÇ…ïKóvÇ≈džÇËǻǙÇÁÅAñ{ï∂ÇÃó¨ÇÍÇ©ÇÁäÑà§ÇπÇ¥ÇÈÇìæÇ»Ç©Ç¡ÇΩÉRÅ[ÉhÇé¶ÇµÇ‹Ç∑ÅB
ïtò^ A
DZÇÍÇÕÅAÅuïtò^ BÅvÇ®ÇÊÇ—Åuïtò^ CÅvÇÃä÷êîÇ…ÇÊǡǃåƒÇ—èoÇ≥ÇÍÇÈÉÜÅ[ÉeÉBÉäÉeÉBä÷êîÇ≈ÅACInfoPBRec Ç™éwíËÇ≥ÇÍÇΩÉfÉBÉåÉNÉgÉäÇ…ä÷Ç∑ÇÈèÓïÒÇä‹ÇfiÇÊǧDžǵNjÇ∑ÅBDZÇÃä÷êîÇ™ÉGÉâÅ[Çï‘Ç≥ǻǢèÍçáÅAåƒÇ—èoǵå≥Ç≈ÇÕÅACInfoPBRec Ç™ê≥èÌÇ…èàóùÇ≥ÇÍÇ‹Ç∑ÅB
static pascal OSErr FSpGetDirInfo(const FSSpec *spec, CInfoPBPtr *cipbpp)
{
OSErr err = noErr;
CInfoPBPtr pbp = (CInfoPBPtr) NewPtrClear (sizeof (*pbp));
*cipbpp = nil;
if (!(err = MemError ( )))
{
pbp->dirInfo.ioVRefNum = spec->vRefNum;
pbp->dirInfo.ioDrDirID = spec->parID;
pbp->dirInfo.ioNamePtr = (StringPtr) spec->name;
err = PBGetCatInfoSync (pbp);
if (!err && !(pbp->hFileInfo.ioFlAttrib & ioDirMask))
err = dirNFErr;
if (err)
DisposePtr ((Ptr) pbp);
else
*cipbpp = pbp;
}
return err;
}
|
ïtò^ B
DZÇÍÇÁÇÃä÷êîÇÕÅAFSpGetFinfo Ç®ÇÊÇ— FSpSetFInfo ÇΔìØÇ∂ API Ç…è]ǧÇÊǧDžîzó∂Ç≥ÇÍǃǢNjÇ∑ÅBDZÇÍÇÁÇÕÅAÅuïtò^ AÅvDždžÇ∞ÇΩ FSpGetDirInfo ÇåƒÇ—èoǵNjÇ∑ÅB
static pascal OSErr FSpGetDInfo(const FSSpec *spec, DInfo *fndrInfo)
{
OSErr err = noErr;
CInfoPBPtr cipbp;
if (!(err = FSpGetDirInfo (spec, &cipbp)))
{
*fndrInfo = cipbp->dirInfo.ioDrUsrWds;
DisposePtr ((Ptr) cipbp);
if (!err) err = MemError ( );
}
return err;
}
static pascal OSErr FSpSetDInfo(const FSSpec *spec, const DInfo *fndrInfo)
{
OSErr err = noErr;
CInfoPBPtr cipbp;
if (!(err = FSpGetDirInfo (spec, &cipbp)))
{
cipbp->dirInfo.ioDrUsrWds = *fndrInfo;
cipbp->dirInfo.ioDrDirID = spec->parID;
err = PBSetCatInfoSync (cipbp);
DisposePtr ((Ptr) cipbp);
if (!err) err = MemError ( );
}
return err;
}
|
ïtò^ C
DZÇÃä÷êîÇÕÅAéwíËÇ≥ÇÍÇΩÉtÉHÉãÉ_ÇÃÉfÉBÉåÉNÉgÉä ID Çï‘ǵNjÇ∑ÅBDZÇÃä÷êîÇÕÅAÅuïtò^ AÅvDždžÇ∞ÇΩ FSpGetDirInfo ÇåƒÇ—èoǵNjÇ∑ÅB
pascal OSErr GetDirectoryID (const FSSpec *spec, long *dirID)
{
OSErr err = noErr;
CInfoPBPtr cipbp;
if (!(err = FSpGetDirInfo (spec, &cipbp)))
{
*dirID = cipbp->dirInfo.ioDrDirID;
DisposePtr ((Ptr) cipbp);
if (!err) err = MemError ( );
}
return err;
}
|
çXêVì˙: 1997 îN 3 åé 17 ì˙
|